// src/utils/analytics.js
import axios from'axios';
import { v4 as uuidv4 } from'uuid';

const TRACKING_API_ENDPOINT = 'http://localhost:3001/api/track'; // 后端接收数据的 API 地址
let userId = null;
let sessionId = uuidv4(); // 每次会话生成一个 session ID，可用于分析会话时长等
let pageViewId = uuidv4(); // 每次页面浏览生成一个唯一 ID
let pageStartTime = Date.now();

// 获取或生成唯一用户标识 (UV ID)
function getUserId() {
    if (userId) return userId;
    userId = localStorage.getItem('analytics_user_id');
    if (!userId) {
        userId = uuidv4();
        localStorage.setItem('analytics_user_id', userId);
    }
    return userId;
}

// 核心上报函数
async function sendEvent(eventType, eventData = {}) {
    const timestamp = Date.now();
    const payload = {
        userId: getUserId(),
        sessionId: sessionId,
        pageViewId: pageViewId, // 关联事件到具体的页面浏览
        eventType: eventType,   // 'pageview', 'heartbeat', 'pageleave' 等
        url: window.location.href,
        timestamp: timestamp,
        referrer: document.referrer,
        screenWidth: window.screen.width,
        screenHeight: window.screen.height,
        language: navigator.language,
        ...eventData, // 其他自定义事件数据
    };

    try {
        // 使用 navigator.sendBeacon 优先，它能在页面卸载时可靠发送
        if (navigator.sendBeacon && eventType === 'pageleave') {
            const blob = new Blob([JSON.stringify(payload)], { type: 'application/json; charset=UTF-8' });
            navigator.sendBeacon(TRACKING_API_ENDPOINT, blob);
            console.log('Beacon sent:', payload);
        } else {
            await axios.post(TRACKING_API_ENDPOINT, payload);
            console.log('Event sent:', payload);
        }
    } catch (error) {
        console.error('Error sending analytics event:', error);
    }
}

// 初始化页面浏览
function trackPageView() {
    pageViewId = uuidv4(); // 新页面，生成新的 PageView ID
    pageStartTime = Date.now();
    sendEvent('pageview');

    // （可选）启动心跳机制，用于更精确计算停留时长
    startHeartbeat();
}

// 页面离开或隐藏时记录
function trackPageLeave() {
    const duration = Date.now() - pageStartTime;
    sendEvent('pageleave', { duration: duration }); // 上报停留时长
    stopHeartbeat(); // 停止心跳
}

// --- 心跳机制 (可选，提高停留时长精度) ---
let heartbeatInterval = null;
const HEARTBEAT_INTERVAL_MS = 15 * 1000; // 每 15 秒发送一次心跳

function startHeartbeat() {
    stopHeartbeat(); // 先停止可能存在的旧心跳
    heartbeatInterval = setInterval(() => {
        // 检查页面是否可见，仅在可见时发送心跳或计算活跃时间
        if (document.visibilityState === 'visible') {
             const activeDuration = Date.now() - pageStartTime; // 或者更复杂的活跃时间计算
             sendEvent('heartbeat', { activeDuration: activeDuration });
        }
    }, HEARTBEAT_INTERVAL_MS);
}

function stopHeartbeat() {
    if (heartbeatInterval) {
        clearInterval(heartbeatInterval);
        heartbeatInterval = null;
    }
}

// --- 监听事件 ---
// SPA 路由切换
function initRouterListener(router) {
    router.afterEach((to, from) => {
        // 路由切换时，视为上一个页面的离开和新页面的浏览
        // 注意：首次加载页面也会触发，需要与 `main.js` 中的初始调用协调
        if (from.name) { // 避免首次加载时 from 为 undefined
            trackPageLeave();
        }
        // 延迟一点确保 URL 更新
        setTimeout(() => {
            trackPageView();
        }, 0);
    });
}

// 页面可见性变化
function initVisibilityListener() {
    document.addEventListener('visibilitychange', () => {
        if (document.visibilityState === 'hidden') {
            // 用户切换 Tab 或最小化窗口，可以视为一次短暂离开
            // 注意：这里策略可以调整，是算作离开还是仅暂停心跳
            trackPageLeave(); // 或者仅 stopHeartbeat();
        } else if (document.visibilityState === 'visible') {
            // 用户切回 Tab，重新开始计时或心跳
            pageStartTime = Date.now(); // 重置开始时间，避免计算错误
            startHeartbeat();
             // 如果切回时需要重新记录 pageview 或 session，可以在此处理
        }
    });
}

// 页面卸载/关闭
function initUnloadListener() {
    // beforeunload 更可靠些，但 unload 也可以用
    // 注意: unload/beforeunload 中不能执行异步操作（如axios.post），必须用 sendBeacon
    window.addEventListener('beforeunload', () => {
        trackPageLeave(); // 确保离开时上报最后的数据
    });
     // 也可以使用 'pagehide' 事件，它在移动端表现更好
     window.addEventListener('pagehide', trackPageLeave);
}


export {
    trackPageView,
    initRouterListener,
    initVisibilityListener,
    initUnloadListener,
    sendEvent // 暴露 sendEvent 用于自定义事件上报
};